home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 9 / FM Towns Free Software Collection 9.iso / t_os / tool / otohime / src / oteff2.c < prev    next >
Text File  |  1994-11-16  |  31KB  |  1,372 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <winb.h>
  5. #include <te.h>
  6. #include <fntb.h>
  7. #include <gui.h>
  8. #include <file_dlg.h>
  9. #include <egb.h>
  10. #include <mos.h>
  11. #include <snd.h>
  12. #include <math.h>
  13. #include "otohime.h"
  14. #include "otolib.h"
  15.  
  16. /* voice change */
  17. int    voicDialogId = -1 ;
  18. int    voicOkBtnId = -1 ;
  19. int    voicPlayBtnId = -1 ;
  20. int    voicUndoBtnId = -1 ;
  21. int    voicInfBtnId = -1 ;
  22. int    voicCanBtnId = -1 ;
  23. int    voicMesId[24] = -1 ;
  24. int    voicSubDialogId = -1 ;
  25. int    voicMulVolumeId = -1 ;
  26. int    voicMulNumId = -1 ;
  27. int    voicCycleNumId = -1 ;
  28. int    voicCrossNumId = -1 ;
  29.  
  30. /* harmony */
  31. int    harmDialogId = -1 ;
  32. int    harmOkBtnId = -1 ;
  33. int    harmPlayBtnId = -1 ;
  34. int    harmUndoBtnId = -1 ;
  35. int    harmInfBtnId = -1 ;
  36. int    harmCanBtnId = -1 ;
  37. int    harmMesId[27] = -1 ;
  38. int    harmSubDialogId = -1 ;
  39. int    harmMainMixVolumeId = -1 ;
  40. int    harmMainMixNumId = -1 ;
  41. int    harmSubMixVolumeId = -1 ;
  42. int    harmSubMixNumId = -1 ;
  43. int    harmMulVolumeId = -1 ;
  44. int    harmMulNumId = -1 ;
  45. int    harmCycleNumId = -1 ;
  46. int    harmCrossNumId = -1 ;
  47.  
  48. /* expander */
  49. int    expDialogId = -1 ;
  50. int    expOkBtnId = -1 ;
  51. int    expPlayBtnId = -1 ;
  52. int    expUndoBtnId = -1 ;
  53. int    expInfBtnId = -1 ;
  54. int    expCanBtnId = -1 ;
  55. int    expMesId[23] = -1 ;
  56. int    expSubDialogId = -1 ;
  57. int    expMulVolumeId = -1 ;
  58. int    expMulNumId = -1 ;
  59. int    expCycleNumId = -1 ;
  60. int    expCrossNumId = -1 ;
  61.  
  62. /* level */
  63. int    levelDialogId = -1 ;
  64. int    levelOkBtnId = -1 ;
  65. int    levelPlayBtnId = -1 ;
  66. int    levelUndoBtnId = -1 ;
  67. int    levelInfBtnId = -1 ;
  68. int    levelCanBtnId = -1 ;
  69. int    levelMesId[19] = -1 ;
  70. int    levelSubDialogId = -1 ;
  71. int    levelMulVolumeId = -1 ;
  72. int    levelMulNumId = -1 ;
  73.  
  74. /* pitch */
  75. int    pitchDialogId = -1 ;
  76. int    pitchOkBtnId = -1 ;
  77. int    pitchPlayBtnId = -1 ;
  78. int    pitchUndoBtnId = -1 ;
  79. int    pitchInfBtnId = -1 ;
  80. int    pitchCanBtnId = -1 ;
  81. int    pitchMesId[20] = -1 ;
  82. int    pitchSubDialogId = -1 ;
  83. int    pitchMulVolumeId = -1 ;
  84. int    pitchMulNumId = -1 ;
  85.  
  86. /* sampling rate set */
  87. int    sampDialogId = -1 ;
  88. int    sampOkBtnId = -1 ;
  89. int    sampPlayBtnId = -1 ;
  90. int    sampUndoBtnId = -1 ;
  91. int    sampCanBtnId = -1 ;
  92. int    sampMesId[7] = -1 ;
  93. int    sampSubDialogId = -1 ;
  94. int    sampRateNumId = -1 ;
  95. int    sampInfBtnId = -1 ;
  96.  
  97.  
  98. /* VOICE CHANGE */
  99.  
  100. int    sndEffectVoiceChange()
  101. {
  102.     MMI_SendMessage( voicDialogId, MM_ATTACH, 1, MMI_GetBaseObj() ) ;
  103.     MMI_SendMessage( voicDialogId, MM_SHOW, 0 ) ;    /* 全体を見せる */
  104.  
  105.     MMI_ExecSystem() ;        /* Dialog表示へ・・・イベントループ */
  106.  
  107.     MMI_SendMessage( voicDialogId, MM_ERASE, 0 ) ;
  108.     MMI_SendMessage( voicDialogId, MM_DETACH, 0 ) ;
  109.  
  110.     return NOERR ;
  111. }
  112.  
  113. /*    initDataIOTVOI:voicOkBtnId:MJ_DBUTTONL40の呼び出し関数    */
  114. int    voicOkchk(kobj, messId, argc, pev, trigger)
  115. int        kobj ;
  116. int        messId ;
  117. int        argc ;
  118. EVENT    *pev ;
  119. int        trigger ;
  120. {
  121.     SNDHEAD *head ;
  122.  
  123.     int    var, min, max, delta, ptColumn ;
  124.     int f, t, mul, c ;
  125.     int ret ;
  126.  
  127.     setMsgColor( voicMesId[0], EXE_COLOR ) ;
  128.  
  129.     head = (SNDHEAD *)sndBuf2 ;
  130.     f = ( head->freq ) * 1000 / 0x62 ;                /* freq */
  131.     f = ( f + 50 )/100 * 100 ;                /* 10の位を四捨五入 */
  132.  
  133.     MMI_SendMessage( voicCycleNumId, MM_GETNUMBOX, 5,    /* 分割周期 */
  134.                         &var, &min, &max, &delta, &ptColumn ) ;
  135.     t = f * var / 1000 ;
  136.  
  137.     MMI_SendMessage( voicMulNumId, MM_GETNUMBOX, 5,        /* Mul */
  138.                         &var, &min, &max, &delta, &ptColumn ) ;
  139.     mul = pow( 2.0, ( (double)var ) /1200 ) * 65536 ;
  140.  
  141.     MMI_SendMessage( voicCrossNumId, MM_GETNUMBOX, 5,    /* cross over */
  142.                         &var, &min, &max, &delta, &ptColumn ) ;
  143.     c = t * var / 100 ;
  144.  
  145.     ret = sndVoiceChng( mul, t, c ) ;
  146.     if( ret )
  147.         errorCheck( ret ) ;
  148.  
  149.     setMsgColor( voicMesId[0], MOJI_COLOR ) ;
  150.  
  151.     MMI_FlushEvnt() ;    /* イベントをフラッシュ */
  152.  
  153.     return NOERR ;
  154. }
  155.  
  156. /*    initDataIOTVOI:voicPlayBtnId:MJ_DBUTTONL40の呼び出し関数    */
  157. int    voicPlay(kobj, messId, argc, pev, trigger)
  158. int        kobj ;
  159. int        messId ;
  160. int        argc ;
  161. EVENT    *pev ;
  162. int        trigger ;
  163. {
  164.     setMsgColor( voicMesId[1], EXE_COLOR ) ;
  165.  
  166.     sndPlay() ;
  167.  
  168.     setMsgColor( voicMesId[1], MOJI_COLOR ) ;
  169.  
  170.     return NOERR ;
  171. }
  172.  
  173. /*    initDataIOTVOI:voicUndoBtnId:MJ_DBUTTONL40の呼び出し関数    */
  174. int    voicUndo(kobj, messId, argc, pev, trigger)
  175. int        kobj ;
  176. int        messId ;
  177. int        argc ;
  178. EVENT    *pev ;
  179. int        trigger ;
  180. {
  181.     setMsgColor( voicMesId[2], EXE_COLOR ) ;
  182.  
  183.     unDo() ;
  184.  
  185.     setMsgColor( voicMesId[2], MOJI_COLOR ) ;
  186.  
  187.     MMI_FlushEvnt() ;    /* イベントをフラッシュ */
  188.  
  189.     return NOERR ;
  190. }
  191.  
  192. /*    initDataIOTVOI:voicInfBtnId:MJ_DBUTTONL40の呼び出し関数    */
  193. int    voicInf(kobj, messId, argc, pev, trigger)
  194. int        kobj ;
  195. int        messId ;
  196. int        argc ;
  197. EVENT    *pev ;
  198. int        trigger ;
  199. {
  200.     /* ダイアログを使えないようにする */
  201.     MTL_setAtrObj( voicDialogId, MS_DSPONLYL40 ) ;
  202.  
  203.     sndInf() ;
  204.  
  205.     /* ダイアログを使えるように戻す */
  206.     MTL_resetAtrObj( voicDialogId, (~MS_DSPONLYL40) ) ;
  207.  
  208.     return NOERR ;
  209. }
  210.  
  211. /*    initDataIOTVOI:voicCanBtnId:MJ_DBUTTONL40の呼び出し関数    */
  212. int    voicCanchk(kobj, messId, argc, pev, trigger)
  213. int        kobj ;
  214. int        messId ;
  215. int        argc ;
  216. EVENT    *pev ;
  217. int        trigger ;
  218. {
  219.     MMI_SetHaltFlag( TRUE ) ;
  220.     return NOERR ;
  221. }
  222.  
  223. /*    initDataIOTVOI:voicMulVolumeId:MJ_SCRLL40の呼び出し関数    */
  224. /*    initDataIOTVOI:voicMulNumId:MJ_NUMBOXL40の呼び出し関数    */
  225. int    voicMulSet(kobj, messId, argc, pev, trigger)
  226. int        kobj ;
  227. int        messId ;
  228. int        argc ;
  229. EVENT    *pev ;
  230. int        trigger ;
  231. {
  232.     int    var, min, max, len, page ;            /* スクロールの変数 */
  233.     int    var2, min2, max2, delta2, ptColumn2 ;    /* 数値設定の変数 */
  234.  
  235.     /* volumeの方は実際の値の1/10 */
  236.  
  237.     if( kobj == voicMulVolumeId )
  238.     {
  239.         MMI_SendMessage( kobj, MM_GETSCROLL, 5,
  240.                                         &var, &min, &max, &len, &page ) ;
  241.         MMI_SendMessage( voicMulNumId, MM_GETNUMBOX, 5,
  242.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  243.         MMI_SendMessage( voicMulNumId, MM_SETNUMBOX, 5,
  244.                             var*10, min2, max2, delta2, ptColumn2 ) ;
  245.         MMI_SendMessage( voicMulNumId, MM_SHOW, 0 ) ;
  246.     }
  247.  
  248.     if( kobj == voicMulNumId )
  249.     {
  250.         MMI_SendMessage( kobj, MM_GETNUMBOX, 5,
  251.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  252.         MMI_SendMessage( voicMulVolumeId, MM_GETSCROLL, 5,
  253.                                         &var, &min, &max, &len, &page ) ;
  254.         MMI_SendMessage( voicMulVolumeId, MM_SETSCROLL, 5,
  255.                                         var2/10, min, max, len, page ) ;
  256.         MMI_SendMessage( voicMulVolumeId, MM_SHOW, 0 ) ;
  257.     }
  258.  
  259.     return NOERR ;
  260. }
  261.  
  262.  
  263. /* HARMONY */
  264.  
  265. int    sndEffectHarmony()
  266. {
  267.     MMI_SendMessage( harmDialogId, MM_ATTACH, 1, MMI_GetBaseObj() ) ;
  268.     MMI_SendMessage( harmDialogId, MM_SHOW, 0 ) ;    /* 全体を見せる */
  269.  
  270.     MMI_ExecSystem() ;        /* Dialog表示へ・・・イベントループ */
  271.  
  272.     MMI_SendMessage( harmDialogId, MM_ERASE, 0 ) ;
  273.     MMI_SendMessage( harmDialogId, MM_DETACH, 0 ) ;
  274.  
  275.     return NOERR ;
  276. }
  277.  
  278. /*    initDataIOTHAR:harmOkBtnId:MJ_DBUTTONL40の呼び出し関数    */
  279. int    harmOkchk(kobj, messId, argc, pev, trigger)
  280. int        kobj ;
  281. int        messId ;
  282. int        argc ;
  283. EVENT    *pev ;
  284. int        trigger ;
  285. {
  286.     SNDHEAD *head ;
  287.  
  288.     char para[64] ;
  289.     char work[512] ;
  290.     int    var, min, max, delta, ptColumn ;
  291.     int f, t, mul, c ;
  292.     int ret ;
  293.  
  294.     setMsgColor( harmMesId[0], EXE_COLOR ) ;
  295.  
  296.     head = (SNDHEAD *)sndBuf2 ;
  297.     f = ( head->freq ) * 1000 / 0x62 ;                /* freq */
  298.     f = ( f + 50 )/100 * 100 ;                /* 10の位を四捨五入 */
  299.  
  300.     MMI_SendMessage( harmCycleNumId, MM_GETNUMBOX, 5,    /* 分割周期 */
  301.                         &var, &min, &max, &delta, &ptColumn ) ;
  302.     t = f * var / 1000 ;
  303.  
  304.     MMI_SendMessage( harmMulNumId, MM_GETNUMBOX, 5,    /* Mul */
  305.                         &var, &min, &max, &delta, &ptColumn ) ;
  306.     mul = pow( 2.0, ( (double)var ) /1200 ) * 65536 ;
  307.  
  308.     MMI_SendMessage( harmCrossNumId, MM_GETNUMBOX, 5,    /* cross over */
  309.                         &var, &min, &max, &delta, &ptColumn ) ;
  310.     c = t * var / 100 ;
  311.  
  312.     ret = sndVoiceChng( mul, t, c ) ;
  313.  
  314.     /* mix */
  315.  
  316.     if( ret )
  317.         errorCheck( ret ) ;
  318.     else
  319.     {
  320.         MMI_SendMessage( harmMainMixNumId, MM_GETNUMBOX, 5,
  321.                         &var, &min, &max, &delta, &ptColumn ) ;
  322.         DWORD( para + 0 ) = var * 256 / 100 ;
  323.         MMI_SendMessage( harmSubMixNumId, MM_GETNUMBOX, 5,
  324.                         &var, &min, &max, &delta, &ptColumn ) ;
  325.         DWORD( para + 4 ) = var * 256 / 100 ;
  326.         DWORD( para + 8 ) = sndBufSize ;
  327.  
  328.         sndMixTrans( sndBuf2, sndBuf1, para, work ) ;
  329.     }
  330.  
  331.     setMsgColor( harmMesId[0], MOJI_COLOR ) ;
  332.  
  333.     MMI_FlushEvnt() ;    /* イベントをフラッシュ */
  334.  
  335.     return NOERR ;
  336. }
  337.  
  338. /*    initDataIOTHAR:harmPlayBtnId:MJ_DBUTTONL40の呼び出し関数    */
  339. int    harmPlay(kobj, messId, argc, pev, trigger)
  340. int        kobj ;
  341. int        messId ;
  342. int        argc ;
  343. EVENT    *pev ;
  344. int        trigger ;
  345. {
  346.     setMsgColor( harmMesId[1], EXE_COLOR ) ;
  347.  
  348.     sndPlay() ;
  349.  
  350.     setMsgColor( harmMesId[1], MOJI_COLOR ) ;
  351.  
  352.     return NOERR ;
  353. }
  354.  
  355. /*    initDataIOTHAR:harmUndoBtnId:MJ_DBUTTONL40の呼び出し関数    */
  356. int    harmUndo(kobj, messId, argc, pev, trigger)
  357. int        kobj ;
  358. int        messId ;
  359. int        argc ;
  360. EVENT    *pev ;
  361. int        trigger ;
  362. {
  363.     setMsgColor( harmMesId[2], EXE_COLOR ) ;
  364.  
  365.     unDo() ;
  366.  
  367.     setMsgColor( harmMesId[2], MOJI_COLOR ) ;
  368.  
  369.     MMI_FlushEvnt() ;    /* イベントをフラッシュ */
  370.  
  371.     return NOERR ;
  372. }
  373.  
  374. /*    initDataIOTHAR:harmInfBtnId:MJ_DBUTTONL40の呼び出し関数    */
  375. int    harmInf(kobj, messId, argc, pev, trigger)
  376. int        kobj ;
  377. int        messId ;
  378. int        argc ;
  379. EVENT    *pev ;
  380. int        trigger ;
  381. {
  382.     /* ダイアログを使えないようにする */
  383.     MTL_setAtrObj( harmDialogId, MS_DSPONLYL40 ) ;
  384.  
  385.     sndInf() ;
  386.  
  387.     /* ダイアログを使えるように戻す */
  388.     MTL_resetAtrObj( harmDialogId, (~MS_DSPONLYL40) ) ;
  389.  
  390.     return NOERR ;
  391. }
  392.  
  393. /*    initDataIOTHAR:harmCanBtnId:MJ_DBUTTONL40の呼び出し関数    */
  394. int    harmCanchk(kobj, messId, argc, pev, trigger)
  395. int        kobj ;
  396. int        messId ;
  397. int        argc ;
  398. EVENT    *pev ;
  399. int        trigger ;
  400. {
  401.     MMI_SetHaltFlag( TRUE ) ;
  402.     return NOERR ;
  403. }
  404.  
  405. /*    initDataIOTHAR:harmMulVolumeId:MJ_SCRLL40の呼び出し関数    */
  406. /*    initDataIOTHAR:harmMulNumId:MJ_NUMBOXL40の呼び出し関数    */
  407. int    harmMulSet(kobj, messId, argc, pev, trigger)
  408. int        kobj ;
  409. int        messId ;
  410. int        argc ;
  411. EVENT    *pev ;
  412. int        trigger ;
  413. {
  414.     int    var, min, max, len, page ;            /* スクロールの変数 */
  415.     int    var2, min2, max2, delta2, ptColumn2 ;    /* 数値設定の変数 */
  416.  
  417.     /* volumeの方は実際の値の1/10 */
  418.  
  419.     if( kobj == harmMulVolumeId )
  420.     {
  421.         MMI_SendMessage( kobj, MM_GETSCROLL, 5,
  422.                                         &var, &min, &max, &len, &page ) ;
  423.         MMI_SendMessage( harmMulNumId, MM_GETNUMBOX, 5,
  424.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  425.         MMI_SendMessage( harmMulNumId, MM_SETNUMBOX, 5,
  426.                             var*10, min2, max2, delta2, ptColumn2 ) ;
  427.         MMI_SendMessage( harmMulNumId, MM_SHOW, 0 ) ;
  428.     }
  429.  
  430.     if( kobj == harmMulNumId )
  431.     {
  432.         MMI_SendMessage( kobj, MM_GETNUMBOX, 5,
  433.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  434.         MMI_SendMessage( harmMulVolumeId, MM_GETSCROLL, 5,
  435.                                         &var, &min, &max, &len, &page ) ;
  436.         MMI_SendMessage( harmMulVolumeId, MM_SETSCROLL, 5,
  437.                                         var2/10, min, max, len, page ) ;
  438.         MMI_SendMessage( harmMulVolumeId, MM_SHOW, 0 ) ;
  439.     }
  440.  
  441.     return NOERR ;
  442. }
  443.  
  444. /*    initDataIOTHAR:harmMainMixVolumeId:MJ_SCRLL40の呼び出し関数    */
  445. /*    initDataIOTHAR:harmMainMixNumId:MJ_NUMBOXL40の呼び出し関数    */
  446. int    harmMainMixSet(kobj, messId, argc, pev, trigger)
  447. int        kobj ;
  448. int        messId ;
  449. int        argc ;
  450. EVENT    *pev ;
  451. int        trigger ;
  452. {
  453.     int    var, min, max, len, page ;            /* スクロールの変数 */
  454.     int    var2, min2, max2, delta2, ptColumn2 ;    /* 数値設定の変数 */
  455.  
  456.     if( kobj == harmMainMixVolumeId )
  457.     {
  458.         MMI_SendMessage( kobj, MM_GETSCROLL, 5,
  459.                                         &var, &min, &max, &len, &page ) ;
  460.         MMI_SendMessage( harmMainMixNumId, MM_GETNUMBOX, 5,
  461.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  462.         MMI_SendMessage( harmMainMixNumId, MM_SETNUMBOX, 5,
  463.                             var, min2, max2, delta2, ptColumn2 ) ;
  464.         MMI_SendMessage( harmMainMixNumId, MM_SHOW, 0 ) ;
  465.     }
  466.  
  467.     if( kobj == harmMainMixNumId )
  468.     {
  469.         MMI_SendMessage( kobj, MM_GETNUMBOX, 5,
  470.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  471.         MMI_SendMessage( harmMainMixVolumeId, MM_GETSCROLL, 5,
  472.                                         &var, &min, &max, &len, &page ) ;
  473.         MMI_SendMessage( harmMainMixVolumeId, MM_SETSCROLL, 5,
  474.                                         var, min, max, len, page ) ;
  475.         MMI_SendMessage( harmMainMixVolumeId, MM_SHOW, 0 ) ;
  476.     }
  477.  
  478.     return NOERR ;
  479. }
  480.  
  481. /*    initDataIOTHAR:harmSubMixVolumeId:MJ_SCRLL40の呼び出し関数    */
  482. /*    initDataIOTHAR:harmSubMixNumId:MJ_NUMBOXL40の呼び出し関数    */
  483. int    harmSubMixSet(kobj, messId, argc, pev, trigger)
  484. int        kobj ;
  485. int        messId ;
  486. int        argc ;
  487. EVENT    *pev ;
  488. int        trigger ;
  489. {
  490.     int    var, min, max, len, page ;            /* スクロールの変数 */
  491.     int    var2, min2, max2, delta2, ptColumn2 ;    /* 数値設定の変数 */
  492.  
  493.     if( kobj == harmSubMixVolumeId )
  494.     {
  495.         MMI_SendMessage( kobj, MM_GETSCROLL, 5,
  496.                                         &var, &min, &max, &len, &page ) ;
  497.         MMI_SendMessage( harmSubMixNumId, MM_GETNUMBOX, 5,
  498.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  499.         MMI_SendMessage( harmSubMixNumId, MM_SETNUMBOX, 5,
  500.                             var, min2, max2, delta2, ptColumn2 ) ;
  501.         MMI_SendMessage( harmSubMixNumId, MM_SHOW, 0 ) ;
  502.     }
  503.  
  504.     if( kobj == harmSubMixNumId )
  505.     {
  506.         MMI_SendMessage( kobj, MM_GETNUMBOX, 5,
  507.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  508.         MMI_SendMessage( harmSubMixVolumeId, MM_GETSCROLL, 5,
  509.                                         &var, &min, &max, &len, &page ) ;
  510.         MMI_SendMessage( harmSubMixVolumeId, MM_SETSCROLL, 5,
  511.                                         var, min, max, len, page ) ;
  512.         MMI_SendMessage( harmSubMixVolumeId, MM_SHOW, 0 ) ;
  513.     }
  514.  
  515.     return NOERR ;
  516. }
  517.  
  518.  
  519. /* EXPANDER */
  520.  
  521. int    sndEffectExpand()
  522. {
  523.     MMI_SendMessage( expDialogId, MM_ATTACH, 1, MMI_GetBaseObj() ) ;
  524.     MMI_SendMessage( expDialogId, MM_SHOW, 0 ) ;    /* 全体を見せる */
  525.  
  526.     MMI_ExecSystem() ;        /* Dialog表示へ・・・イベントループ */
  527.  
  528.     MMI_SendMessage( expDialogId, MM_ERASE, 0 ) ;
  529.     MMI_SendMessage( expDialogId, MM_DETACH, 0 ) ;
  530.  
  531.     return NOERR ;
  532. }
  533.  
  534. /*    initDataIOTEXP:expOkBtnId:MJ_DBUTTONL40の呼び出し関数    */
  535. int    expOkchk(kobj, messId, argc, pev, trigger)
  536. int        kobj ;
  537. int        messId ;
  538. int        argc ;
  539. EVENT    *pev ;
  540. int        trigger ;
  541. {
  542.     SNDHEAD *head ;
  543.  
  544.     int    var, min, max, delta, ptColumn ;
  545.     int f, t, mul, c ;
  546.     int ret ;
  547.  
  548.     setMsgColor( expMesId[0], EXE_COLOR ) ;
  549.  
  550.     head = (SNDHEAD *)sndBuf2 ;
  551.     f = ( head->freq ) * 1000 / 0x62 ;                /* freq */
  552.     f = ( f + 50 )/100 * 100 ;                /* 10の位を四捨五入 */
  553.  
  554.     MMI_SendMessage( expCycleNumId, MM_GETNUMBOX, 5,    /* 分割周期 */
  555.                         &var, &min, &max, &delta, &ptColumn ) ;
  556.     t = f * var / 1000 ;
  557.  
  558.     MMI_SendMessage( expMulNumId, MM_GETNUMBOX, 5,    /* Mul */
  559.                         &var, &min, &max, &delta, &ptColumn ) ;
  560.     mul = var * 65536 / 100 ;
  561.  
  562.     MMI_SendMessage( expCrossNumId, MM_GETNUMBOX, 5,    /* cross over */
  563.                         &var, &min, &max, &delta, &ptColumn ) ;
  564.     c = t * var / 100 ;
  565.  
  566.     ret = sndVoiceExpand( mul, t, c ) ;
  567.     if( ret )
  568.         errorCheck( ret ) ;
  569.  
  570.     setMsgColor( expMesId[0], MOJI_COLOR ) ;
  571.  
  572.     MMI_FlushEvnt() ;    /* イベントをフラッシュ */
  573.  
  574.     return NOERR ;
  575. }
  576.  
  577. /*    initDataIOTEXP:expPlayBtnId:MJ_DBUTTONL40の呼び出し関数    */
  578. int    expPlay(kobj, messId, argc, pev, trigger)
  579. int        kobj ;
  580. int        messId ;
  581. int        argc ;
  582. EVENT    *pev ;
  583. int        trigger ;
  584. {
  585.     setMsgColor( expMesId[1], EXE_COLOR ) ;
  586.  
  587.     sndPlay() ;
  588.  
  589.     setMsgColor( expMesId[1], MOJI_COLOR ) ;
  590.  
  591.     return NOERR ;
  592. }
  593.  
  594. /*    initDataIOTEXP:expUndoBtnId:MJ_DBUTTONL40の呼び出し関数    */
  595. int    expUndo(kobj, messId, argc, pev, trigger)
  596. int        kobj ;
  597. int        messId ;
  598. int        argc ;
  599. EVENT    *pev ;
  600. int        trigger ;
  601. {
  602.     setMsgColor( expMesId[2], EXE_COLOR ) ;
  603.  
  604.     unDo() ;
  605.  
  606.     setMsgColor( expMesId[2], MOJI_COLOR ) ;
  607.  
  608.     MMI_FlushEvnt() ;    /* イベントをフラッシュ */
  609.  
  610.     return NOERR ;
  611. }
  612.  
  613. /*    initDataIOTEXP:expInfBtnId:MJ_DBUTTONL40の呼び出し関数    */
  614. int    expInf(kobj, messId, argc, pev, trigger)
  615. int        kobj ;
  616. int        messId ;
  617. int        argc ;
  618. EVENT    *pev ;
  619. int        trigger ;
  620. {
  621.     /* ダイアログを使えないようにする */
  622.     MTL_setAtrObj( expDialogId, MS_DSPONLYL40 ) ;
  623.  
  624.     sndInf() ;
  625.  
  626.     /* ダイアログを使えるように戻す */
  627.     MTL_resetAtrObj( expDialogId, (~MS_DSPONLYL40) ) ;
  628.  
  629.     return NOERR ;
  630. }
  631.  
  632. /*    initDataIOTEXP:expCanBtnId:MJ_DBUTTONL40の呼び出し関数    */
  633. int    expCanchk(kobj, messId, argc, pev, trigger)
  634. int        kobj ;
  635. int        messId ;
  636. int        argc ;
  637. EVENT    *pev ;
  638. int        trigger ;
  639. {
  640.     MMI_SetHaltFlag( TRUE ) ;
  641.     return NOERR ;
  642. }
  643.  
  644. /*    initDataIOTEXP:expMulVolumeId:MJ_SCRLL40の呼び出し関数    */
  645. /*    initDataIOTEXP:expMulNumId:MJ_NUMBOXL40の呼び出し関数    */
  646. int    expMulSet(kobj, messId, argc, pev, trigger)
  647. int        kobj ;
  648. int        messId ;
  649. int        argc ;
  650. EVENT    *pev ;
  651. int        trigger ;
  652. {
  653.     int    var, min, max, len, page ;            /* スクロールの変数 */
  654.     int    var2, min2, max2, delta2, ptColumn2 ;    /* 数値設定の変数 */
  655.  
  656.     if( kobj == expMulVolumeId )
  657.     {
  658.         MMI_SendMessage( kobj, MM_GETSCROLL, 5,
  659.                                         &var, &min, &max, &len, &page ) ;
  660.         MMI_SendMessage( expMulNumId, MM_GETNUMBOX, 5,
  661.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  662.         MMI_SendMessage( expMulNumId, MM_SETNUMBOX, 5,
  663.                             var, min2, max2, delta2, ptColumn2 ) ;
  664.         MMI_SendMessage( expMulNumId, MM_SHOW, 0 ) ;
  665.     }
  666.  
  667.     if( kobj == expMulNumId )
  668.     {
  669.         MMI_SendMessage( kobj, MM_GETNUMBOX, 5,
  670.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  671.         MMI_SendMessage( expMulVolumeId, MM_GETSCROLL, 5,
  672.                                         &var, &min, &max, &len, &page ) ;
  673.         MMI_SendMessage( expMulVolumeId, MM_SETSCROLL, 5,
  674.                                         var2, min, max, len, page ) ;
  675.         MMI_SendMessage( expMulVolumeId, MM_SHOW, 0 ) ;
  676.     }
  677.  
  678.     return NOERR ;
  679. }
  680.  
  681.  
  682. /* LEVEL */
  683.  
  684. int    sndEffectLevel()
  685. {
  686.     MMI_SendMessage( levelDialogId, MM_ATTACH, 1, MMI_GetBaseObj() ) ;
  687.     MMI_SendMessage( levelDialogId, MM_SHOW, 0 ) ;    /* 全体を見せる */
  688.  
  689.     MMI_ExecSystem() ;        /* Dialog表示へ・・・イベントループ */
  690.  
  691.     MMI_SendMessage( levelDialogId, MM_ERASE, 0 ) ;
  692.     MMI_SendMessage( levelDialogId, MM_DETACH, 0 ) ;
  693.  
  694.     return NOERR ;
  695. }
  696.  
  697. /*    initDataIOTLEV:levelOkBtnId:MJ_DBUTTONL40の呼び出し関数    */
  698. int    levelOkchk(kobj, messId, argc, pev, trigger)
  699. int        kobj ;
  700. int        messId ;
  701. int        argc ;
  702. EVENT    *pev ;
  703. int        trigger ;
  704. {
  705.     int    var, min, max, delta, ptColumn ;
  706.     int mul ;
  707.     int ret ;
  708.  
  709.     setMsgColor( levelMesId[0], EXE_COLOR ) ;
  710.  
  711.     MMI_SendMessage( levelMulNumId, MM_GETNUMBOX, 5,    /* Mul */
  712.                         &var, &min, &max, &delta, &ptColumn ) ;
  713.     mul = pow( 10.0, ( (double)var / 200 ) ) * 65536 ;
  714.  
  715.     sndLevelExpand( mul ) ;
  716.  
  717.     ret = setMsgColor( levelMesId[0], MOJI_COLOR ) ;
  718.     if( ret )
  719.         errorCheck( ret ) ;
  720.  
  721.     MMI_FlushEvnt() ;    /* イベントをフラッシュ */
  722.  
  723.     return NOERR ;
  724. }
  725.  
  726. /*    initDataIOTLEV:levelPlayBtnId:MJ_DBUTTONL40の呼び出し関数    */
  727. int    levelPlay(kobj, messId, argc, pev, trigger)
  728. int        kobj ;
  729. int        messId ;
  730. int        argc ;
  731. EVENT    *pev ;
  732. int        trigger ;
  733. {
  734.     setMsgColor( levelMesId[1], EXE_COLOR ) ;
  735.  
  736.     sndPlay() ;
  737.  
  738.     setMsgColor( levelMesId[1], MOJI_COLOR ) ;
  739.  
  740.     return NOERR ;
  741. }
  742.  
  743. /*    initDataIOTLEV:levelUndoBtnId:MJ_DBUTTONL40の呼び出し関数    */
  744. int    levelUndo(kobj, messId, argc, pev, trigger)
  745. int        kobj ;
  746. int        messId ;
  747. int        argc ;
  748. EVENT    *pev ;
  749. int        trigger ;
  750. {
  751.     setMsgColor( levelMesId[2], EXE_COLOR ) ;
  752.  
  753.     unDo() ;
  754.  
  755.     setMsgColor( levelMesId[2], MOJI_COLOR ) ;
  756.  
  757.     MMI_FlushEvnt() ;    /* イベントをフラッシュ */
  758.  
  759.     return NOERR ;
  760. }
  761.  
  762. /*    initDataIOTLEV:levelInfBtnId:MJ_DBUTTONL40の呼び出し関数    */
  763. int    levelInf(kobj, messId, argc, pev, trigger)
  764. int        kobj ;
  765. int        messId ;
  766. int        argc ;
  767. EVENT    *pev ;
  768. int        trigger ;
  769. {
  770.     /* ダイアログを使えないようにする */
  771.     MTL_setAtrObj( levelDialogId, MS_DSPONLYL40 ) ;
  772.  
  773.     sndInf() ;
  774.  
  775.     /* ダイアログを使えるように戻す */
  776.     MTL_resetAtrObj( levelDialogId, (~MS_DSPONLYL40) ) ;
  777.  
  778.     return NOERR ;
  779. }
  780.  
  781. /*    initDataIOTLEV:levelCanBtnId:MJ_DBUTTONL40の呼び出し関数    */
  782. int    levelCanchk(kobj, messId, argc, pev, trigger)
  783. int        kobj ;
  784. int        messId ;
  785. int        argc ;
  786. EVENT    *pev ;
  787. int        trigger ;
  788. {
  789.     MMI_SetHaltFlag( TRUE ) ;
  790.     return NOERR ;
  791. }
  792.  
  793. /*    initDataIOTLEV:levelMulVolumeId:MJ_SCRLL40の呼び出し関数    */
  794. /*    initDataIOTLEV:levelMulNumId:MJ_NUMBOXL40の呼び出し関数    */
  795. int    levelMulSet(kobj, messId, argc, pev, trigger)
  796. int        kobj ;
  797. int        messId ;
  798. int        argc ;
  799. EVENT    *pev ;
  800. int        trigger ;
  801. {
  802.     int    var, min, max, len, page ;            /* スクロールの変数 */
  803.     int    var2, min2, max2, delta2, ptColumn2 ;    /* 数値設定の変数 */
  804.  
  805.     if( kobj == levelMulVolumeId )
  806.     {
  807.         MMI_SendMessage( kobj, MM_GETSCROLL, 5,
  808.                                         &var, &min, &max, &len, &page ) ;
  809.         MMI_SendMessage( levelMulNumId, MM_GETNUMBOX, 5,
  810.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  811.         MMI_SendMessage( levelMulNumId, MM_SETNUMBOX, 5,
  812.                             var, min2, max2, delta2, ptColumn2 ) ;
  813.         MMI_SendMessage( levelMulNumId, MM_SHOW, 0 ) ;
  814.     }
  815.  
  816.     if( kobj == levelMulNumId )
  817.     {
  818.         MMI_SendMessage( kobj, MM_GETNUMBOX, 5,
  819.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  820.         MMI_SendMessage( levelMulVolumeId, MM_GETSCROLL, 5,
  821.                                         &var, &min, &max, &len, &page ) ;
  822.         MMI_SendMessage( levelMulVolumeId, MM_SETSCROLL, 5,
  823.                                         var2, min, max, len, page ) ;
  824.         MMI_SendMessage( levelMulVolumeId, MM_SHOW, 0 ) ;
  825.     }
  826.  
  827.     return NOERR ;
  828. }
  829.  
  830.  
  831. /* PITCH */
  832.  
  833. int    sndEffectPitch()
  834. {
  835.     MMI_SendMessage( pitchDialogId, MM_ATTACH, 1, MMI_GetBaseObj() ) ;
  836.     MMI_SendMessage( pitchDialogId, MM_SHOW, 0 ) ;    /* 全体を見せる */
  837.  
  838.     MMI_ExecSystem() ;        /* Dialog表示へ・・・イベントループ */
  839.  
  840.     MMI_SendMessage( pitchDialogId, MM_ERASE, 0 ) ;
  841.     MMI_SendMessage( pitchDialogId, MM_DETACH, 0 ) ;
  842.  
  843.     return NOERR ;
  844. }
  845.  
  846. /*    initDataIOTPCH:pitchOkBtnId:MJ_DBUTTONL40の呼び出し関数    */
  847. int    pitchOkchk(kobj, messId, argc, pev, trigger)
  848. int        kobj ;
  849. int        messId ;
  850. int        argc ;
  851. EVENT    *pev ;
  852. int        trigger ;
  853. {
  854.     SNDHEAD *head ;
  855.     char para[64] ;
  856.     char work[512] ;
  857.     int    var, min, max, delta, ptColumn ;
  858.     int mul, len ;
  859.  
  860.     setMsgColor( pitchMesId[0], EXE_COLOR ) ;
  861.  
  862.     head = (SNDHEAD *)sndBuf2 ;
  863.  
  864.     MMI_SendMessage( pitchMulNumId, MM_GETNUMBOX, 5,    /* Mul */
  865.                         &var, &min, &max, &delta, &ptColumn ) ;
  866.     mul = pow( 2.0, ( (double)var ) /1200 ) * 65536 ;
  867.  
  868.     len = head->length ;
  869.     len = (double)len * 0x10000 / mul ;
  870.     if( len > sndBufSize-32 )
  871.     {
  872.         errorCheck( OUT_OF_MEMORY ) ;
  873.     }
  874.     else
  875.     {
  876.         DWORD( para + 0 ) = (unsigned int)mul ;
  877.         DWORD( para + 4 ) = (unsigned int)sndBufSize ;
  878.         sndPitch( sndBuf2, sndBuf1, para, work ) ;
  879.     }
  880.  
  881.     setMsgColor( pitchMesId[0], MOJI_COLOR ) ;
  882.  
  883.     MMI_FlushEvnt() ;    /* イベントをフラッシュ */
  884.  
  885.     return NOERR ;
  886. }
  887.  
  888. /*    initDataIOTPCH:pitchPlayBtnId:MJ_DBUTTONL40の呼び出し関数    */
  889. int    pitchPlay(kobj, messId, argc, pev, trigger)
  890. int        kobj ;
  891. int        messId ;
  892. int        argc ;
  893. EVENT    *pev ;
  894. int        trigger ;
  895. {
  896.     setMsgColor( pitchMesId[1], EXE_COLOR ) ;
  897.  
  898.     sndPlay() ;
  899.  
  900.     setMsgColor( pitchMesId[1], MOJI_COLOR ) ;
  901.  
  902.     return NOERR ;
  903. }
  904.  
  905. /*    initDataIOTPCH:pitchUndoBtnId:MJ_DBUTTONL40の呼び出し関数    */
  906. int    pitchUndo(kobj, messId, argc, pev, trigger)
  907. int        kobj ;
  908. int        messId ;
  909. int        argc ;
  910. EVENT    *pev ;
  911. int        trigger ;
  912. {
  913.     setMsgColor( pitchMesId[2], EXE_COLOR ) ;
  914.  
  915.     unDo() ;
  916.  
  917.     setMsgColor( pitchMesId[2], MOJI_COLOR ) ;
  918.  
  919.     MMI_FlushEvnt() ;    /* イベントをフラッシュ */
  920.  
  921.     return NOERR ;
  922. }
  923.  
  924. /*    initDataIOTPCH:pitchInfBtnId:MJ_DBUTTONL40の呼び出し関数    */
  925. int    pitchInf(kobj, messId, argc, pev, trigger)
  926. int        kobj ;
  927. int        messId ;
  928. int        argc ;
  929. EVENT    *pev ;
  930. int        trigger ;
  931. {
  932.     /* ダイアログを使えないようにする */
  933.     MTL_setAtrObj( pitchDialogId, MS_DSPONLYL40 ) ;
  934.  
  935.     sndInf() ;
  936.  
  937.     /* ダイアログを使えるように戻す */
  938.     MTL_resetAtrObj( pitchDialogId, (~MS_DSPONLYL40) ) ;
  939.  
  940.     return NOERR ;
  941. }
  942.  
  943. /*    initDataIOTPCH:pitchCanBtnId:MJ_DBUTTONL40の呼び出し関数    */
  944. int    pitchCanchk(kobj, messId, argc, pev, trigger)
  945. int        kobj ;
  946. int        messId ;
  947. int        argc ;
  948. EVENT    *pev ;
  949. int        trigger ;
  950. {
  951.     MMI_SetHaltFlag( TRUE ) ;
  952.     return NOERR ;
  953. }
  954.  
  955. /*    initDataIOTPCH:pitchMulVolumeId:MJ_SCRLL40の呼び出し関数    */
  956. /*    initDataIOTPCH:pitchMulNumId:MJ_NUMBOXL40の呼び出し関数    */
  957. int    pitchMulSet(kobj, messId, argc, pev, trigger)
  958. int        kobj ;
  959. int        messId ;
  960. int        argc ;
  961. EVENT    *pev ;
  962. int        trigger ;
  963. {
  964.     int    var, min, max, len, page ;            /* スクロールの変数 */
  965.     int    var2, min2, max2, delta2, ptColumn2 ;    /* 数値設定の変数 */
  966.  
  967.     /* volumeの方は実際の値の1/10 */
  968.  
  969.     if( kobj == pitchMulVolumeId )
  970.     {
  971.         MMI_SendMessage( kobj, MM_GETSCROLL, 5,
  972.                                         &var, &min, &max, &len, &page ) ;
  973.         MMI_SendMessage( pitchMulNumId, MM_GETNUMBOX, 5,
  974.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  975.         MMI_SendMessage( pitchMulNumId, MM_SETNUMBOX, 5,
  976.                             var*10, min2, max2, delta2, ptColumn2 ) ;
  977.         MMI_SendMessage( pitchMulNumId, MM_SHOW, 0 ) ;
  978.     }
  979.  
  980.     if( kobj == pitchMulNumId )
  981.     {
  982.         MMI_SendMessage( kobj, MM_GETNUMBOX, 5,
  983.                             &var2, &min2, &max2, &delta2, &ptColumn2 ) ;
  984.         MMI_SendMessage( pitchMulVolumeId, MM_GETSCROLL, 5,
  985.                                         &var, &min, &max, &len, &page ) ;
  986.         MMI_SendMessage( pitchMulVolumeId, MM_SETSCROLL, 5,
  987.                                         var2/10, min, max, len, page ) ;
  988.         MMI_SendMessage( pitchMulVolumeId, MM_SHOW, 0 ) ;
  989.     }
  990.  
  991.     return NOERR ;
  992. }
  993.  
  994.  
  995. /* SAMPLING RATE SET */
  996.  
  997. int    sndEffectSampSet()
  998. {
  999.     MMI_SendMessage( sampDialogId, MM_ATTACH, 1, MMI_GetBaseObj() ) ;
  1000.     MMI_SendMessage( sampDialogId, MM_SHOW, 0 ) ;    /* 全体を見せる */
  1001.  
  1002.     MMI_ExecSystem() ;        /* Dialog表示へ・・・イベントループ */
  1003.  
  1004.     MMI_SendMessage( sampDialogId, MM_ERASE, 0 ) ;
  1005.     MMI_SendMessage( sampDialogId, MM_DETACH, 0 ) ;
  1006.  
  1007.     return NOERR ;
  1008. }
  1009.  
  1010. /*    initDataIOTSMP:sampOkBtnId:MJ_DBUTTONL40の呼び出し関数    */
  1011. int    sampOkchk(kobj, messId, argc, pev, trigger)
  1012. int        kobj ;
  1013. int        messId ;
  1014. int        argc ;
  1015. EVENT    *pev ;
  1016. int        trigger ;
  1017. {
  1018.     SNDHEAD *head1, *head2 ;
  1019.     char para[64] ;
  1020.     char work[512] ;
  1021.     int    var, min, max, delta, ptColumn ;
  1022.     int f, mul, len ;
  1023.  
  1024.     setMsgColor( sampMesId[0], EXE_COLOR ) ;
  1025.  
  1026.     head1 = (SNDHEAD *)sndBuf1 ;
  1027.     head2 = (SNDHEAD *)sndBuf2 ;
  1028.  
  1029.     MMI_SendMessage( sampRateNumId, MM_GETNUMBOX, 5,    /* freq */
  1030.                         &var, &min, &max, &delta, &ptColumn ) ;
  1031.     f = var * 0x62 / 1000 ;
  1032.     mul = 65536 * ( head2->freq ) / f ;
  1033.  
  1034.     len = head2->length ;
  1035.     len = (double)len * 0x10000 / mul ;
  1036.     if( len > sndBufSize-32 )
  1037.     {
  1038.         errorCheck( OUT_OF_MEMORY ) ;
  1039.     }
  1040.     else
  1041.     {
  1042.         DWORD( para + 0 ) = (unsigned int)mul ;
  1043.         DWORD( para + 4 ) = (unsigned int)sndBufSize ;
  1044.         sndPitch( sndBuf2, sndBuf1, para, work ) ;
  1045.         head1->freq = f ;
  1046.     }
  1047.  
  1048.     setMsgColor( sampMesId[0], MOJI_COLOR ) ;
  1049.  
  1050.     MMI_FlushEvnt() ;    /* イベントをフラッシュ */
  1051.  
  1052.     return NOERR ;
  1053. }
  1054.  
  1055. /*    initDataIOTSMP:sampPlayBtnId:MJ_DBUTTONL40の呼び出し関数    */
  1056. int    sampPlay(kobj, messId, argc, pev, trigger)
  1057. int        kobj ;
  1058. int        messId ;
  1059. int        argc ;
  1060. EVENT    *pev ;
  1061. int        trigger ;
  1062. {
  1063.     setMsgColor( sampMesId[1], EXE_COLOR ) ;
  1064.  
  1065.     sndPlay() ;
  1066.  
  1067.     setMsgColor( sampMesId[1], MOJI_COLOR ) ;
  1068.  
  1069.     return NOERR ;
  1070. }
  1071.  
  1072. /*    initDataIOTSMP:sampUndoBtnId:MJ_DBUTTONL40の呼び出し関数    */
  1073. int    sampUndo(kobj, messId, argc, pev, trigger)
  1074. int        kobj ;
  1075. int        messId ;
  1076. int        argc ;
  1077. EVENT    *pev ;
  1078. int        trigger ;
  1079. {
  1080.     setMsgColor( sampMesId[2], EXE_COLOR ) ;
  1081.  
  1082.     unDo() ;
  1083.  
  1084.     setMsgColor( sampMesId[2], MOJI_COLOR ) ;
  1085.  
  1086.     MMI_FlushEvnt() ;    /* イベントをフラッシュ */
  1087.  
  1088.     return NOERR ;
  1089. }
  1090.  
  1091. /*    initDataIOTSMP:sampCanBtnId:MJ_DBUTTONL40の呼び出し関数    */
  1092. int    sampCanchk(kobj, messId, argc, pev, trigger)
  1093. int        kobj ;
  1094. int        messId ;
  1095. int        argc ;
  1096. EVENT    *pev ;
  1097. int        trigger ;
  1098. {
  1099.     MMI_SetHaltFlag( TRUE ) ;
  1100.     return NOERR ;
  1101. }
  1102.  
  1103. /*    initDataIOTSMP:sampInfBtnId:MJ_DBUTTONL40の呼び出し関数    */
  1104. int    sampInf(kobj, messId, argc, pev, trigger)
  1105. int        kobj ;
  1106. int        messId ;
  1107. int        argc ;
  1108. EVENT    *pev ;
  1109. int        trigger ;
  1110. {
  1111.     /* ダイアログを使えないようにする */
  1112.     MTL_setAtrObj( sampDialogId, MS_DSPONLYL40 ) ;
  1113.  
  1114.     sndInf() ;
  1115.  
  1116.     /* ダイアログを使えるように戻す */
  1117.     MTL_resetAtrObj( sampDialogId, (~MS_DSPONLYL40) ) ;
  1118.  
  1119.     return NOERR ;
  1120. }
  1121.  
  1122.  
  1123. /* これ以後は, このソースのCによる音声処理ルーチン */
  1124.  
  1125. static int sndLength ;
  1126.  
  1127. /*
  1128. ボイスチェンジャ
  1129. <<<引数の説明>>>
  1130. 変換周波数の倍率, 1まとまりの出力データバイト数, クロスオーバ領域バイト数
  1131. */
  1132. /* rateや率は65536倍の値 */
  1133. sndVoiceChng( mul, pack, dec )
  1134. int mul ;
  1135. int pack ;
  1136. int dec ;
  1137. {
  1138.     SNDHEAD *head ;
  1139.     int i, n, p ;
  1140.     int x, p0i, p0f, p1i, p1f ;
  1141.  
  1142.     if( pack <= 0 )
  1143.         pack = 1 ;
  1144.  
  1145.     head = (SNDHEAD *)sndBuf1 ;
  1146.     sndLength = head->length ;
  1147.  
  1148.     if( sndLength > sndBufSize-32 )
  1149.         return OUT_OF_MEMORY ;
  1150.  
  1151.     n = 0 ;
  1152.     p0i = n ;
  1153.     p0f = 0 ;
  1154.     p1i = n ;
  1155.     p1f = 0 ;
  1156.  
  1157.     while( n < sndLength )
  1158.     {
  1159.         p = 0 ;
  1160.         for( i=0 ; i<dec ; i++ )
  1161.         {
  1162. /*
  1163.             double keisuu ;
  1164.             keisuu = (cos( _PI*i/dec ) + 1 )/2 ;
  1165.             x = smpSnd( p0i, p0f ) * keisuu
  1166.              + smpSnd( p1i, p1f ) * ( 1 - keisuu ) ;
  1167. */
  1168.             int k ;
  1169.             k = ( hiSpeedSin( i*0x20000/dec + 0x10000 ) + 0x10000 ) >> 1 ;
  1170.             x = (smpSnd( p0i, p0f )* k
  1171.              + smpSnd( p1i, p1f ) * ( 0x10000 - k )) >> 16 ;
  1172.  
  1173.             writeSnd( n, x ) ;
  1174.             addPoint( &p0i, &p0f, mul ) ;
  1175.             addPoint( &p1i, &p1f, mul ) ;
  1176.             p++ ;
  1177.             n++ ;
  1178.             if( n >= sndLength )goto voic01 ;
  1179.         }
  1180.         while( p < pack )
  1181.         {
  1182.             writeSnd( n, smpSnd( p1i, p1f ) ) ;
  1183.             addPoint( &p1i, &p1f, mul ) ;
  1184.             p++ ;
  1185.             n++ ;
  1186.             if( n >= sndLength )goto voic01 ;
  1187.         }
  1188.         p0i = p1i ;
  1189.         p0f = p1f ;
  1190.         p1i = n ;
  1191.         p1f = 0 ;
  1192. voic01:    ;
  1193.     }
  1194.  
  1195.     return NOERR ;
  1196. }
  1197.  
  1198. /*
  1199. エキスパンダ
  1200. <<<引数の説明>>>
  1201. 時間の倍率, 1まとまりの出力データバイト数, クロスオーバ領域バイト数
  1202. */
  1203. /* rateや率は65536倍の値 */
  1204. sndVoiceExpand( mul, pack, dec )
  1205. int mul ;
  1206. int pack ;
  1207. int dec ;
  1208. {
  1209.     SNDHEAD *head1, *head2 ;
  1210.     int i, n, p ;
  1211.     int x, p0, p1 ;
  1212.     unsigned int newLength ;
  1213.     unsigned int loopp, loopl ;
  1214.  
  1215.     if( pack <= 0 )
  1216.         pack = 1 ;
  1217.  
  1218.     head1 = (SNDHEAD *)sndBuf1 ;
  1219.     head2 = (SNDHEAD *)sndBuf2 ;
  1220.     sndLength = head2->length ;
  1221.     newLength = ( (double)mul ) * sndLength / 0x10000 ;
  1222.  
  1223.     if( newLength > sndBufSize-32 )
  1224.         return OUT_OF_MEMORY ;
  1225.  
  1226.     head1->length = newLength ;
  1227.     loopp = head2->looppoint ;
  1228.     loopl = head2->looplength ;
  1229.     loopp = ( (double)mul ) * loopp / 0x10000 ;
  1230.     loopl = ( (double)mul ) * loopl / 0x10000 ;
  1231.     if( loopp >= newLength )loopp = newLength - 1 ;
  1232.     if( loopp+loopl > newLength )loopl = newLength - loopp ;
  1233.     head1->looppoint = loopp ;
  1234.     head1->looplength = loopl ;
  1235.  
  1236.     n = 0 ;
  1237.     p0 = n ;
  1238.     p1 = n ;
  1239.  
  1240.     while( n < newLength )
  1241.     {
  1242.         p = 0 ;
  1243.         for( i=0 ; i<dec ; i++ )
  1244.         {
  1245. /*
  1246.             double keisuu 
  1247.             x = ( readSnd( p0 ) * ( dec - i ) + readSnd( p1 ) * i ) / dec ;
  1248.             keisuu = (cos( _PI*i/dec ) + 1 )/2 ;
  1249.             x = readSnd( p0 ) * keisuu
  1250.              + readSnd( p1 ) * ( 1 - keisuu ) ;
  1251. */
  1252.  
  1253.             int k ;
  1254.             k = ( hiSpeedSin( i*0x20000/dec + 0x10000 ) + 0x10000 ) >> 1 ;
  1255.             x = (readSnd( p0 ) * k + readSnd( p1 ) * ( 0x10000 - k )) >> 16 ;
  1256.  
  1257.             writeSnd( n, x ) ;
  1258.             p0++ ;
  1259.             p1++ ;
  1260.             p++ ;
  1261.             n++ ;
  1262.             if( n >= newLength )goto voic01 ;
  1263.         }
  1264.         while( p < pack )
  1265.         {
  1266.             writeSnd( n, readSnd( p1 ) ) ;
  1267.             p1++ ;
  1268.             p++ ;
  1269.             n++ ;
  1270.             if( n >= newLength )goto voic01 ;
  1271.         }
  1272.         p0 = p1 ;
  1273.         p1 = ( (double)sndLength ) * n / newLength ;
  1274. voic01:    ;
  1275.     }
  1276.  
  1277.     return NOERR ;
  1278. }
  1279.  
  1280. /* レベルコントロール */
  1281. /* rateや率は65536倍の値 */
  1282. sndLevelExpand( mul )
  1283. int mul ;
  1284. {
  1285.     SNDHEAD *head ;
  1286.     int i ;
  1287.  
  1288.     head = (SNDHEAD *)sndBuf1 ;
  1289.     sndLength = head->length ;
  1290.     if( sndLength > sndBufSize-32 )
  1291.         return OUT_OF_MEMORY ;
  1292.  
  1293.     for( i=0 ; i<sndLength ; i++ )
  1294.     {
  1295.         writeSnd(  i,   ( ( ( readSnd( i ) >> 8 ) * mul ) >> 8 )    ) ;
  1296.     }
  1297.  
  1298.     return NOERR ;
  1299. }
  1300.  
  1301. static int readSnd( i )
  1302. int i ;
  1303. {
  1304.     int d ;
  1305.  
  1306.     if( i >= sndLength )
  1307.         return 0 ;
  1308.  
  1309.     d = sndBuf2[ i + 32 ] ;
  1310.     d &= 0xff ;
  1311.     if( d >= 128 )
  1312.         d = 128 - d ;
  1313.  
  1314.     return ( d << 8 ) ;
  1315. }
  1316.  
  1317. static int smpSnd( i, f )
  1318. int i ;
  1319. int f ;
  1320. {
  1321.     int d1, d2 ;
  1322.  
  1323.     if( i >= sndLength )
  1324.         return 0 ;
  1325.  
  1326.     d1 = sndBuf2[ i + 32 ] ;
  1327.     d1 &= 0xff ;
  1328.     if( d1 >= 128 )
  1329.         d1 = 128 - d1 ;
  1330.     d2 = sndBuf2[ i + 33 ] ;
  1331.     d2 &= 0xff ;
  1332.     if( d2 >= 128 )
  1333.         d2 = 128 - d2 ;
  1334.     f &= 0xffff ;
  1335.  
  1336.     return ( ( d1 * ( 0x10000 - f ) + d2 * f ) >> 8 ) ;
  1337. }
  1338.  
  1339. static int writeSnd( p, x )
  1340. int p ;
  1341. int x ;
  1342. {
  1343.     x = ( x >> 8 ) ;
  1344.  
  1345.     if( x <= 0 )
  1346.     {
  1347.         x = 128 - x ;
  1348.         if( x > 254 )
  1349.             x = 254 ;
  1350.     }
  1351.     else if( x > 127 )
  1352.         x = 127 ;
  1353.  
  1354.     sndBuf1[ p + 32 ] = x ;
  1355.  
  1356.     return NOERR ;
  1357. }
  1358.  
  1359. static int addPoint( i, f, mul )
  1360. int *i ;
  1361. int *f ;
  1362. int mul ;
  1363. {
  1364.  
  1365.     *f = *f + mul ;
  1366.     *i = *i + ( *f >> 16 ) ;
  1367.     *f = ( *f & 0xffff ) ;
  1368.  
  1369.     return NOERR ;
  1370. }
  1371.  
  1372.